﻿// See https://aka.ms/new-console-template for more information
//模板模式
//模板模式是一种行为型设计模式，他定义了一个算法的步骤，并允许子类为一个或多个步骤提供其实现方式。在模板模式中，算法的步骤通常被定义在一个抽象类中，而具体实现类则被延迟到子类中。

//模板模式通常用于解决以下的问题：
//·多个类中存在相同的算法步骤，但其中的某些步骤的实现可能不同。
//·想要避免代码重复，同时又不希望通过继承来实现。

//在现实生活中，很多事情都包含几个实现步骤，例如请客吃饭，无论吃什么，一般都包含点单，吃东西，买单等几个步骤，通常情况下这几个步骤的次序是点单->吃东西->买单。在这桑步骤中，点单和买单大同小异，最大的区别在于第二部，吃什么，吃面套还是吃满汉全席是大不相同的。

//在软件开发中，开发人员有时也会遇到类似的问题，某个方法的实现需要多个步骤，其中有些步骤是固定的，有些则是不固定的，存在可变性。为了提高代码的可用性和系统的灵活性，可以使用一种被成为模板方法模式的设计模式来进行设计，在模板模式中将实现功能中的每一个方法称为基本方法，而调用这些方法并决定其执行次序的方法称为模板方法。我们可以将相同的代码放在父类，而有变化的代码则由子类实现，这样就可以解决上面吃什么的问题了。

//模板方法模式通常由以下两个角色构成。
//·AbstractClass（抽象父类）：在抽象类中会定义一系列的基本操作，这些操作可以是具体的也可以是抽象的，每一个方法都对应了算法步骤中的一步，在其子类中可以重复定义实现这些步骤。同时，在抽象类中实现了一个模板方法，用于定义一个算法的框架。
//·ConcreteClass（具体子类）：是抽象类的子类，用于在子类中实现父类中声明的抽象基本操作，及完成子类特定算法的步骤，也可以覆盖在父类中已经实现的具体基本操作。
Algorithm Algorithm = new ConcreteAlgorithm1();
Algorithm.Run();
Algorithm=new ConcreteAlgorithm2();
Algorithm.Run();




Console.WriteLine("Hello, World!");

//抽象类，定义算法骨架
abstract class Algorithm
{
    public void Run()
    {
        Step1();
        Step2();
        Step3();
    }
    protected abstract void Step1();
    protected abstract void Step2();
    protected abstract void Step3();
}

//具体类1，实现算法的具体步骤
class ConcreteAlgorithm1 : Algorithm
{
    protected override void Step1()
    {
        Console.WriteLine("实现类1操作1");
    }

    protected override void Step2()
    {
        Console.WriteLine("实现类1操作2");
    }

    protected override void Step3()
    {
        Console.WriteLine("实现类1操作3");
    }
}
//具体类2，实现算法的具体步骤
class ConcreteAlgorithm2 : Algorithm
{
    protected override void Step1()
    {
        Console.WriteLine("实现类2操作1");
    }

    protected override void Step2()
    {
        Console.WriteLine("实现类2操作2");
    }

    protected override void Step3()
    {
        Console.WriteLine("实现类2操作3");
    }
}
